Refactor silnika + automatyczne uchwyty
Właśnie mija tydzień od zakończenia dwutygodniowego pobytu w domu w czasie końcówki sesji i przerwy egzaminacyjnej. W tym czasie rozpocząłem przepisywania mojego “silnika” od nowa, tym razem w oparciu o interfejsy. Są one bardzo poręczne, gdy chce się ukryć implementację klas wewnątrz statycznych, bądź dynamicznych bibliotek. Głównym założeniem przy projektowaniu drugiej wersji NIne było właśnie ukrycie implementacji wewnątrz statycznej biblioteki .lib. Dzięki takiemu postępowaniu biblioteka wygląda ładnie i pozwala ładnie rozszerzać własną funkcjonalność.
Drugim zagadnieniem poruszanym w tej notce są uchwyty, które same zarządzają licznikiem danego zasobu.
Z początku implementację uchwytów opierałem na artykule znajdującym się w książce “Game Programming Gems”, jednak problemem okazało się zmuszenie tychże uchwytów do sprzątania po sobie zasobów. Na szczęście rozwiązanie okazało się proste, ponieważ wystarczyło umieścić w klasie uchwytu wskaźnik do menadżera zasobów.
Poniżej znajduje się moja implementacja takiego uchwytu:
template< typename TAG> class AutomaticHandle { public: // Podstawowy konstruktor AutomaticHandle(Dword handle, MHandleMgr* manager) : m_handle(handle), m_manager(manager) {} // Konstruktor kopiujący AutomaticHandle(const AutomaticHandle& src) : m_manager(src.m_manager), m_handle(src.m_handle) { m_manager->Copy(src.m_handle); } // Destruktor ~AutomaticHandle() { m_manager->Release(m_handle); } // Operator przypisania const AutomaticHandle& operator =(const ManagedHandle& src) { m_manager->Release(m_handle); m_handle = src.m_handle; m_manager->Copy(src.m_handle); return src; } // Operator Dword operator Dword() const { return m_handle; } /* ... */ private: // Uchwyt Dword m_handle; // Wskaźnik do managera MHandleMgr* m_manager; }; |
Jak widać klasa zawiera dodatkową zmienną – wskaźnik na klasę menadżera ustawiany przy konstrukcji. Klasa menadżera musi zawierać używane metody, które wewnątrz zarządzają licznikiem odwołań na dany zasób, a w momencie jego spadku do 0, likwidować dany zasób.
Leave a comment